package asignacionDeRevisores;

import callForPapers.*;
import sistema.*;

import java.util.ArrayList;
import java.util.List;


public class AsignacionPorAreasDeInteres extends AsignacionDeRevisores {

    /**
     * @param listaRevisores
     * @param paper
     * @return 
     * Me da una sublista de los revisores que tienen un area en comun
     * con el paper dado.
     */
   
    public List<Usuario> filtrarRevisoresPorAreasDeInteres(
	    List<Usuario> listaRevisores, Paper paper) {
	// Transformo los SETs en LISTs (haciendo una copia de las 2 listas, de
	// paso.)
	List<AreaDeInteres> areasPaper = new ArrayList<AreaDeInteres>();
	areasPaper.addAll(paper.getAreasDeInteres());

	List<Usuario> listaDeRevisores = new ArrayList<Usuario>();
	listaDeRevisores.addAll(listaRevisores);

	List<Usuario> revisoresFiltrados = new ArrayList<Usuario>();

	for (Usuario revisorActual : listaDeRevisores) {
	    // si tiene al menos un área en común, lo pone en la lista:
	    if (this.tieneAlMenos1AreaEnComun(areasPaper,
		    revisorActual.getAreasDeInteres())) {
		revisoresFiltrados.add(revisorActual);
	    }
	}
	return revisoresFiltrados;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * asignacionDeRevisores.AsignacionDeRevisores#asignarRevisores(callForPapers
     * .CallForPaper)
     */
    
    public void asignarRevisores(CallForPaper cfp) {
	List<Paper> unicoPaper = new ArrayList<Paper>();
	// Conversores de Set a List:
	// Transformo los SETs en LISTs (haciendo una copia de las 2 listas, de
	// paso.)

	List<Usuario> revisores = new ArrayList<Usuario>();
	revisores.addAll(this.obtenerListaDeRevisores(cfp));
	List<Paper> papers = new ArrayList<Paper>();
	papers.addAll(this.obtenerListaDePapers(cfp));

	for (Paper paperActual : papers) {
	    // Al siguiente paper le voy a asignar revisores.
	    unicoPaper.add(paperActual);
	    // Lista de Revisores con areas en comun:
	    List<Usuario> revisoresConAreasEnComun = filtrarRevisoresPorAreasDeInteres(
		    revisores, paperActual);

	    // si la lista es menor a 3 completo al azar:
	    List<Usuario> listaCompletaDeRevisores = completarListaRevisoresAlAzar(
		    revisores, revisoresConAreasEnComun);

	    // Asignador:
	    super.asignarPapersARevisores(listaCompletaDeRevisores, unicoPaper);
	}
    }
 }
